﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using ibba.src.norisk.ServiceComboMotivo;
using Infragistics.Documents.Excel;

namespace ibba.src.norisk
{

    public partial class PageGarantiaContratoImpExcel : ChildWindow
    {
        #region VARIAVEIS

        private List<ServiceGarantiaContrato.TipoParametroGarantia> _listTiposParametros;
        private List<ServiceGarantiaContrato.GarantiaContrato> _listaImportacao;
        private int _parametroSelecionado;
        CultureInfo culture = new CultureInfo("pt-BR");
        FileInfo _filePlanilha;
        public List<ServiceComboMotivo.ComboMotivo> motivos = null;

        #endregion

        #region CONSTRUTOR

        public PageGarantiaContratoImpExcel()
        {
            this.CarregarMotivos();
            InitializeComponent();
        }

        #endregion

        #region EVENTOS

        private void cboParametro_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            if ((ServiceGarantiaContrato.TipoParametroGarantia)cboParametro.SelectedItem != null)
            {
                _parametroSelecionado = 0;

                _parametroSelecionado = ((ServiceGarantiaContrato.TipoParametroGarantia)cboParametro.SelectedItem).IdTipoParametroGarantia;

                txtNomeArquivo.Text = "";
            }
        }

        //EVENTO DE SELECIONAR UM ARQUIVO LOCAL
        private void btnSelecionarArquivo_Click(object sender, RoutedEventArgs e)
        {
            tbCaminho.Text = EscolherOrigem();

            ExibeCarregando(false, null);
        }

        //EVENTO DO BOTAO IMPORTAR
        private void btnImportarArquivo_Click(object sender, RoutedEventArgs e)
        {
            if (txtNomeArquivo.Text == "")
            {
                MessageBoxHelper.ShowWarning("Erro", "Você ainda não selecionou um arquivo");
            }
            else if (_listaImportacao.Count == 0)
            {
                MessageBoxHelper.ShowWarning("Erro", "O arquivo não contém dados");
            }
            else
            {
                MessageBoxHelper.ShowQuestion("Confirmação", "Confirma a importação?", window_OnMessageBoxClosed);
            }
        }

        //EVENTO DE FECHAR A MENSAGEM DA TELA
        void window_OnMessageBoxClosed(MessageBoxResult result)
        {
            if (result == MessageBoxResult.Yes)
            {
                ExibeCarregando(true, "Carregando...");
                ImportarGarantiaContrato();
                //Encerrar();
            }
            else
            {
                ExibeCarregando(false, "");
            }
        }

        //EVENTO DO BOTAO FECHAR
        private void btnFechar_Click(object sender, RoutedEventArgs e)
        {
            Encerrar();
        }

        #endregion

        #region METODOS

        //METODO RESPONSAVEL PELA EXIBIÇÃO DA TELA
        public void Exibir()
        {
            this.Visibility = Visibility.Visible;
            this.Show();

            CarregarComboTipoParametro();
            cboFormato.Items.Clear();
            cboFormato.Items.Add("Excel (*.xls, *.xlsx)");
            cboFormato.Items.Add("Csv Files (*.csv)");
            cboFormato.SelectedIndex = 0;

            txtNomeArquivo.Text = "";

            _listaImportacao = new List<ServiceGarantiaContrato.GarantiaContrato>();
            _listTiposParametros = new List<ServiceGarantiaContrato.TipoParametroGarantia>();

            _parametroSelecionado = 0;
        }

        public void Encerrar()
        {
            this.Close();
        }


        //METODO QUE EXIBE MENSAGEM DE CARREGANDO
        private void ExibeCarregando(bool enable, string busyContent)
        {
            activity.BusyContent = busyContent;
            activity.IsBusy = enable;
        }


        //CARREGA A COMBO DE PARAMETROS
        private void CarregarComboTipoParametro()
        {
            ServiceFactory.GetInstance().ServiceGarantiaContrato.BeginObterTipoParametroGarantia(CallBackObterTipoParametroGarantia, ServiceFactory.GetInstance().ServiceGarantiaContrato);
        }

        private void CallBackObterTipoParametroGarantia(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                _listTiposParametros = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndObterTipoParametroGarantia(pAsyncResult);

                cboParametro.ItemsSource = _listTiposParametros.Where(t => t.IdTipoParametroGarantia != 5).ToList();
                cboParametro.SelectedIndex = 0;
            });
        }

        //METODO DE IMPORTACAO EM LOTE POR ARQUIVO
        private void ImportarGarantiaContrato()
        {
            ExibeCarregando(true, "Carregando...");

            ServiceFactory.GetInstance().ServiceGarantiaContrato.BeginAtualizarGarantiaContrato(_listaImportacao, AppHelper.LoginUsuario, true, CallBackImportarGarantiaContrato, ServiceFactory.GetInstance().ServiceGarantiaContrato);
        }

        private void CallBackImportarGarantiaContrato(IAsyncResult pAsyncResult)
        {

            this.Dispatcher.BeginInvoke(delegate()
            {
                try
                {
                    int retorno = ((ServiceGarantiaContrato.IGarantiaContrato)pAsyncResult.AsyncState).EndAtualizarGarantiaContrato(pAsyncResult);

                    if (retorno == -2)
                    {
                        MessageBoxHelper.ShowWarning("Erro", "Existem garantias inválidas no arquivo. Importação abortada.");
                        return;
                    }
                    if (retorno == -3)
                    {
                        MessageBoxHelper.ShowWarning("Erro", "Existem contratos inválidos no arquivo. Importação abortada.");
                        return;
                    }
                    if (retorno == -4)
                    {
                        MessageBoxHelper.ShowWarning("Erro", "Existem clientes inválidos no arquivo. Importação abortada.");
                        return;
                    }

                    MessageBoxHelper.ShowSucess("Sucesso", string.Format("Arquivo importado com sucesso. {0}{1} registro(s) atualizado(s)", Environment.NewLine, _listaImportacao.Count));
                }
                catch (Exception ex)
                {
                    MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível carregar o arquivo", ex.Message.ToString());
                }
                finally
                {
                    ExibeCarregando(false, "Carregando...");
                }
            });
        }

        //METODO USADO PARA O DIALOGO DE SELEÇÃO DE ARQUIVO
        private String EscolherOrigem()
        {
            OpenFileDialog dlg = new OpenFileDialog();

            string strNome = "";

            // Limpa campos da tela
            txtNomeArquivo.Text = "";
            this.tbCaminho.Text = "";

            bool erro = false;

            dlg.Multiselect = false;
            dlg.Filter = "Excel Worksheets 2003 (*.xls, *.xlsx)|*.xls;*.xlsx|Csv files (*.csv)|*.csv";

            // Ativa o FileDialog para selecionar um arquivo
            bool? retval = dlg.ShowDialog();

            dlg.Multiselect = false;

            if (retval != null && retval == true)
            {
                try
                {
                    ExibeCarregando(true, "Aguarde a validação do arquivo...");

                    //Validar o tipo do arquivo
                    if (dlg.File.Extension.ToLower() == ".xls" && !this.cboFormato.SelectedValue.ToString().ToLower().Contains("xls"))
                    {
                        erro = true;
                    }
                    else if (dlg.File.Extension.ToLower() == ".csv" && !this.cboFormato.SelectedValue.ToString().ToLower().Contains("csv"))
                    {
                        erro = true;

                    }
                    else if (dlg.File.Extension.ToLower() != ".csv" && dlg.File.Extension.ToLower() != ".xls" && dlg.File.Extension.ToLower() != ".xlsx")
                    {
                        erro = true;
                    }

                    if (erro)
                    {
                        MessageBoxHelper.ShowWarning("Aviso", string.Concat("Selecione um arquivo no formato ", this.cboFormato.SelectedValue.ToString(), " para prosseguir com a importação."));
                        return "";
                    }

                    this.txtNomeArquivo.Text = dlg.File.Name;


                    try
                    {
                        if (retval == true)
                        {
                            if (dlg.File.Extension.ToLower() == ".xls" || dlg.File.Extension.ToLower() == ".xlsx")
                            {
                                strNome = CarregaExcel(dlg.File);
                            }
                            else
                            {
                                strNome = CarregaCsv(dlg.File);
                            }
                        }
                    }
                    catch (IOException ioex)
                    {
                        this.txtNomeArquivo.Text = "";
                        MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível abrir o arquivo\n\nSe o mesmo estiver aberto, feche-o e tente novamente.", ioex.Message.ToString());
                    }
                    catch (Exception ex)
                    {
                        this.txtNomeArquivo.Text = "";
                        MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível carregar o arquivo", ex.Message.ToString());
                    }
                }
                catch (Exception ex)
                {
                    MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível carregar o arquivo", ex.Message.ToString());
                }
                finally
                {
                    ExibeCarregando(false, null);
                }
            }

            return strNome;
        }

        //METODO QUE CARREGA 0 ARQUIVO CASO SEJA DO EXCEL
        private string CarregaExcel(FileInfo pPlanilha)
        {
            FileStream stream = null;

            _filePlanilha = pPlanilha;

            ServiceGarantiaContrato.GarantiaContrato garantiaContrato = new ServiceGarantiaContrato.GarantiaContrato();

            int _lin = 0;
            int _col = 0;

            DateTime dOutIni = new DateTime();
            DateTime dOutFim = new DateTime();

            try
            {
                ExibeCarregando(true, "Carregando...");

                if (pPlanilha == null)
                    return null;
                else
                {
                    txtNomeArquivo.Text = pPlanilha.Name;

                    stream = pPlanilha.OpenRead();
                    Workbook excelFile = Workbook.Load(stream);
                    stream.Close();

                    if (excelFile == null)
                        return null;

                    Worksheet sheet = excelFile.Worksheets[0];

                    _listaImportacao.Clear();

                    foreach (var r in sheet.Rows)
                    {
                        _lin = r.Index + 1;

                        if (r.Index == 0)
                        {

                            if ((r.Cells[0].Value.ToString() != "CD_CONTRATO") ||
                                (r.Cells[1].Value.ToString() != "ID_CLIENTE") ||
                                (r.Cells[2].Value.ToString() != "NO_GARANTIA") ||
                                (r.Cells[3].Value.ToString() != "DT_INICIO") ||
                                (r.Cells[4].Value.ToString() != "DT_TERMINO") ||
                                (r.Cells[5].Value.ToString() != "VL_PARAMETRO") ||
                                (r.Cells[6].Value.ToString() != "ID_MOTIVO") ||
                                (r.Cells[7].Value.ToString() != "DS_JUSTIFICATIVA"))
                            {
                                MessageBoxHelper.ShowWarning("Erro", "O arquivo não está no formato correto");
                                txtNomeArquivo.Text = string.Empty;
                                return null;
                            }
                        }

                        else if (r.Cells[0] != null)
                        {
                            ExibeCarregando(true, string.Format("Carregando ... [{0} / {1}]", r.Index + 1, _listaImportacao.Count.ToString()));

                            if (r.Cells[0].Value != null)
                            {
                                _col = 0; //indice da coluna

                                garantiaContrato = new ServiceGarantiaContrato.GarantiaContrato();

                                _col = r.Cells[0].ColumnIndex;
                                garantiaContrato.CodContrato = r.Cells[0].Value.ToString();

                                _col = r.Cells[1].ColumnIndex;
                                garantiaContrato.CodCliente = Convert.ToInt32(r.Cells[1].Value.ToString());

                                _col = r.Cells[2].ColumnIndex;
                                garantiaContrato.CodGarantia = Convert.ToInt32(r.Cells[2].Value.ToString());

                                _col = r.Cells[3].ColumnIndex;
                                if (r.Cells[3].Value == null)
                                {
                                    MessageBoxHelper.ShowWarning("Erro", "Campo Data de início de vigência do Parâmetro não pode estar vazio. Importação abortada.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }

                                if (!(DateTime.TryParse(r.Cells[3].Value.ToString(), culture, DateTimeStyles.None, out dOutIni)))
                                {
                                    try
                                    {
                                        dOutIni = DateTime.FromOADate(double.Parse(r.Cells[3].Value.ToString()));
                                    }
                                    catch (Exception ioex)
                                    {
                                        MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Data de início de vigência inválida. Esperado: dd/mm/aaaa. Importação abortada.", ioex.Message.ToString());
                                    }
                                }
                                garantiaContrato.DtInicio = dOutIni;

                                _col = r.Cells[4].ColumnIndex;
                                if (r.Cells[4].Value == null)
                                {
                                    //MessageBoxHelper.ShowWarning("Erro", "Campo Data de fim de vigência do Parâmetro não pode estar vazio.Importação abortada.");
                                    //txtNomeArquivo.Text = string.Empty;
                                    //return null;
                                    garantiaContrato.DtTermino = null;
                                }
                                else
                                {

                                    if (!(DateTime.TryParse(r.Cells[4].Value.ToString(), culture, DateTimeStyles.None, out dOutFim)))
                                    {
                                        try
                                        {
                                            dOutFim = DateTime.FromOADate(double.Parse(r.Cells[4].Value.ToString()));
                                        }
                                        catch (Exception ioex)
                                        {
                                            MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Data de fim de vigência inválida. Esperado: dd/mm/aaaa. Importação abortada.", ioex.Message.ToString());
                                        }
                                    }
                                    garantiaContrato.DtTermino = dOutFim;
                                }

                                if (garantiaContrato.DtTermino < garantiaContrato.DtInicio)
                                {
                                    MessageBoxHelper.ShowWarning("Aviso", "A data término deve ser maior que a data início.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }

                                garantiaContrato.IdParametro = _parametroSelecionado;

                                _col = r.Cells[5].ColumnIndex;
                                if (r.Cells[5].Value == null)
                                {
                                    MessageBoxHelper.ShowWarning("Erro", "Campo Valor do Parâmetro não pode estar vazio. Importação abortada.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }
                                garantiaContrato.VlParametro = ValidarValorParametro(_parametroSelecionado, r.Cells[5].Value.ToString());

                                //if (ValidarValorParametro(_parametroSelecionado, r.Cells[5].Value.ToString()) != null)
                                //{
                                //    garantiaContrato.VlParametro = ValidarValorParametro(_parametroSelecionado, r.Cells[5].Value.ToString());
                                //}
                                //else
                                //{
                                //    MessageBoxHelper.ShowWarning("Erro", string.Format("Valor do parâmetro inválido ({0}). Importação abortada.", r.Cells[5].Value.ToString()));
                                //    txtNomeArquivo.Text = string.Empty;
                                //    return null;
                                //}

                                _col = r.Cells[6].ColumnIndex;
                                if (r.Cells[6].Value == null)
                                {
                                    MessageBoxHelper.ShowWarning("Erro", "Campo Motivo não pode estar vazio. Importação abortada.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }

                                garantiaContrato.IdMotivo = Convert.ToInt32(r.Cells[6].Value.ToString());
                                if ((from m in motivos where int.Parse(r.Cells[6].Value.ToString()) == m.IdMotivo select motivos).Count() == 0)
                                {
                                    MessageBoxHelper.ShowWarning("Erro", "Campo Motivo possui valor inválido. Importação abortada.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }
                                _col = r.Cells[7].ColumnIndex;
                                if (r.Cells[7].Value == null)
                                {
                                    MessageBoxHelper.ShowWarning("Erro", "Campo Justificativa não pode estar vazio. Importação abortada.");
                                    txtNomeArquivo.Text = string.Empty;
                                    return null;
                                }
                                garantiaContrato.DsJustificativa = r.Cells[7].Value.ToString();

                                _listaImportacao.Add(garantiaContrato);
                            }
                        }
                    }
                }
            }
            catch (IOException ioex)
            {
                txtNomeArquivo.Text = string.Empty;
                MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível abrir o arquivo\n\nSe o mesmo estiver aberto, feche-o e tente novamente.", ioex.Message.ToString());
                return null;
            }
            catch (Exception ex)
            {
                if (_lin > 0)
                {
                    MessageBoxHelper.ShowErro(AppHelper.NomeSistema, string.Format("Ocorreu um erro na linha {0}, coluna {1}", _lin, _col + 1), ex.Message.ToString());
                }
                else
                {
                    MessageBoxHelper.ShowErro(AppHelper.NomeSistema, "Não foi possível carregar o arquivo", ex.Message.ToString());
                }

                txtNomeArquivo.Text = string.Empty;
                return null;
            }
            finally
            {
                if (stream != null)
                    stream.Close();

                ExibeCarregando(false, null);
            }

            txtNomeArquivo.Text += string.Format(" ({0} linhas)", _listaImportacao.Count);

            return txtNomeArquivo.Text;
        }


        //METODO QUE CARREGA 0 ARQUIVO CASO SEJA CSV
        private string CarregaCsv(FileInfo File)
        {
            ServiceGarantiaContrato.GarantiaContrato garantiaContrato = new ServiceGarantiaContrato.GarantiaContrato();

            string sLine;
            int _lin = 0;

            System.IO.Stream fileStream = File.OpenRead();
            System.IO.StreamReader reader = new System.IO.StreamReader(fileStream);

            while (reader.Peek() != -1)
            {
                sLine = reader.ReadLine();
                sLine = sLine.Replace("%", "");

                var array = new List<string>(sLine.Split(';'));

                if (_lin == 0)
                {
                    if ((array[0].ToString() != "CD_CONTRATO") ||
                        (array[1].ToString() != "ID_CLIENTE") ||
                        (array[2].ToString() != "NO_GARANTIA") ||
                        (array[3].ToString() != "DT_INICIO") ||
                        (array[4].ToString() != "DT_TERMINO") ||
                        (array[5].ToString() != "VL_PARAMETRO") ||
                        (array[6].ToString() != "ID_MOTIVO") ||
                        (array[7].ToString() != "DS_JUSTIFICATIVA"))
                    {
                        MessageBoxHelper.ShowWarning("Erro", "O arquivo não está no formato correto");
                        txtNomeArquivo.Text = string.Empty;
                        return null;
                    }
                }

                else
                {
                    garantiaContrato = new ServiceGarantiaContrato.GarantiaContrato();
                    garantiaContrato.CodContrato = Convert.ToString(array[0]);
                    garantiaContrato.CodCliente = Convert.ToInt32(array[1]);
                    garantiaContrato.CodGarantia = Convert.ToInt32(array[2]);
                    garantiaContrato.DtInicio = DateTime.ParseExact(array[3].ToString(), "dd/MM/yyyy", culture);
                    garantiaContrato.DtTermino = DateTime.ParseExact(array[4].ToString(), "dd/MM/yyyy", culture);
                    garantiaContrato.IdParametro = _parametroSelecionado;
                    garantiaContrato.VlParametro = ValidarValorParametro(_parametroSelecionado, Convert.ToString(array[5]));
                    garantiaContrato.IdMotivo = Convert.ToInt32(array[6]);
                    garantiaContrato.DsJustificativa = Convert.ToString(array[7]);

                    _listaImportacao.Add(garantiaContrato);
                }

                _lin += 1;
            }

            fileStream.Close();

            txtNomeArquivo.Text += string.Format(" ({0} linhas)", _listaImportacao.Count);

            return txtNomeArquivo.Text;
        }


        public string ValidarValorParametro(int idParametro, string ValorParametro)
        {
            string retorno = "0";
            int vlParametro;

            if (ValorParametro.ToUpper().Trim() != "DEFAULT" && int.TryParse(ValorParametro, out vlParametro))
            {
                Decimal vlDouble;
                Decimal.TryParse(ValorParametro.Trim(), out vlDouble);

                int aux = 0;

                switch (idParametro)
                {
                    case 1:
                        aux = 100;
                        break;
                    case 2:
                        aux = 100;
                        break;
                    case 3:
                        aux = 100;
                        break;
                    case 4:
                        aux = 3;
                        break;
                    case 7:
                        aux = 1;
                        break;
                }

                if (vlDouble >= 0 && vlDouble <= aux)
                {
                    retorno = ValorParametro;
                }
                else
                {
                    return retorno;
                }
            }
            else
            {
                switch (ValorParametro.ToUpper().Trim())
                {
                    case "S":
                        retorno = "1";
                        break;
                    case "N":
                        retorno = "0";
                        break;
                    case "DEFAULT":
                        retorno = "DEFAULT";
                        break;
                    default:
                        retorno = "0";
                        break;
                }
            }

            return retorno;
        }

        private void CarregarMotivos()
        {
            ServiceFactory.GetInstance().ServiceComboMotivo.BeginObterComboMotivo(CallBackObterMotivos,
                ServiceFactory.GetInstance().ServiceComboMotivo);
        }

        private void CallBackObterMotivos(IAsyncResult pAsyncResult)
        {
            this.Dispatcher.BeginInvoke(delegate()
            {
                this.motivos = ((ServiceComboMotivo.IComboMotivo)pAsyncResult.AsyncState).EndObterComboMotivo(pAsyncResult);
            });
        }

        #endregion


    }

}